﻿using System;
using System.IO;
using System.Xml.Serialization;
using USU.MetricsMonitor.Storage;

namespace USU.MetricsMonitor.Storage
{
    public class XmlStorage : IStorage
    {
        private const string FILE_EXT = "xml";

        public string DefaultFileExtension
        {
            get { return FILE_EXT; }
        }

        public void Save<T>( string filePath, T obj )
        {
            try
            {
                using ( var fs = File.OpenWrite( filePath ) )
                {
                    fs.SetLength( 0 );
                    var xmlSerializer = new XmlSerializer( typeof (T) );
                    xmlSerializer.Serialize( fs, obj );
                }
            }
            catch ( Exception ex )
            {
                throw new StorageException( "Ошибка при сохранении объекта.", ex );
            }
        }

        public T Load<T>( string filePath )
        {
            try
            {
                using ( var fs = File.OpenRead( filePath ) )
                {
                    var xmlSerializer = new XmlSerializer( typeof( T ) );
                    return (T)xmlSerializer.Deserialize( fs );
                }
            }
            catch ( Exception ex )
            {
                throw new StorageException( "Ошибка при получении объекта из хранилища.", ex );
            }
        }

        public bool Exists( string filePath )
        {
            return File.Exists( filePath );
        }
    }
}